package nii.game.mobileserio.player;

import nii.game.mobileserio.interfacesprite.InterfaceSprite;

import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.sprite.AnimatedSprite;
import org.anddev.andengine.entity.sprite.Sprite;
import org.anddev.andengine.opengl.texture.TextureOptions;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.anddev.andengine.opengl.texture.region.TextureRegion;
import org.anddev.andengine.opengl.texture.region.TiledTextureRegion;

import android.content.Context;

public class Player implements InterfaceSprite
{
	//=================================================|| Declarations ||=======================================================//
	
	int STATUS_PLAYER = StatusPlayer.MOVE_RIGHT; // Hướng di chuyển Mario ban đầu

	private BitmapTextureAtlas player_BitmapTextureAtlas; // Lưu ảnh trong bộ nhớ
	private TiledTextureRegion player_TiledTextureRegion; // Lưu khi load ảnh
	public AnimatedSprite player_AnimatedSprite; // AnimatedSprite

	// Vị trí Player
	private float positionX = 0;
	private float positionY = 0;
	
	// Ảnh A, B để xét va chạm
	private BitmapTextureAtlas ABBitmapTextureAtlas; // Lưu khi load ảnh A, B
    private TextureRegion ATextureRegion; // Vùng nhớ trong BitmapTextureAtlas
    private TextureRegion BTextureRegion; // Vùng nhớ trong BitmapTextureAtlas
    private Sprite A, B; // Sprite để add vào Scene
    
    private int HEART = 3; // Mạng của PLAYER ban đầu
    
	public Player() { // Contructor
	};

	//==============================================|| onLoadResource Function ||==============================================//
	
	public void onLoadResources(Engine mEngine, Context mContext) {
		
		// Khai báo đường dẫn đến thư mục hình ảnh
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		
		this.player_BitmapTextureAtlas = new BitmapTextureAtlas(256, 64, TextureOptions.DEFAULT);
		// Tấm ảnh có 8 cột, 1 dòng
		this.player_TiledTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.player_BitmapTextureAtlas, mContext, "player_small.png", 0, 0, 8, 1);
		mEngine.getTextureManager().loadTexture(this.player_BitmapTextureAtlas);
		
		this.ABBitmapTextureAtlas = new BitmapTextureAtlas(32, 32, TextureOptions.DEFAULT);
        this.ATextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.ABBitmapTextureAtlas, mContext, "A.png", 0, 0);
        this.BTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.ABBitmapTextureAtlas, mContext, "B.png", 16, 0);
        mEngine.getTextureManager().loadTextures(this.ABBitmapTextureAtlas);
        
        
	}

	//================================================|| onLoadScene Function ||==============================================//
	
	public void onLoadScene(Scene mScene) {
		player_AnimatedSprite = new AnimatedSprite(this.positionX, this.positionY, this.player_TiledTextureRegion.deepCopy());
		player_AnimatedSprite.setCullingEnabled(true);
		//showPlayerStatus();
		mScene.attachChild(player_AnimatedSprite); // Add vao mScene
		
		this.A = new Sprite(-100, -100 , this.ATextureRegion);
        A.setVisible(false);
        mScene.attachChild(A);
                
        this.B = new Sprite(-100, -100 , this.BTextureRegion);
        B.setVisible(false);
        mScene.attachChild(B);
        
	}
	
	//================================================|| Get & Set Functions ||===============================================//
	
	// Hàm lấy AnimatedSprite của Player
	public AnimatedSprite getAnimatedSprite(){
		return player_AnimatedSprite;
	}
	// Hàm lấy tọa độ X
	public float getX(){
		return this.player_AnimatedSprite.getX();
	}
	// Hàm lấy tọa độ Y
	public float getY(){
		return this.player_AnimatedSprite.getY();
	}
	//Hàm lấy độ rộng của Sprite
	public float getWidth(){
		return this.player_AnimatedSprite.getWidth();
	}
	// Hàm lấy độ cao của Sprite
	public float getHeight(){
		return this.player_AnimatedSprite.getHeight();
	}
	
	//------------------------------------------------
	
	// Thiết đặt tọa độ X của Player
	public void setPositionX(float positionX){
		this.positionX = positionX;
	}
	//Lấy vị trí X của Player
	public float getPositionX(){
		return this.positionX;
	}
	//-----------------------------------------
	// Thiết đặt tọa độ Y của Player
	public void setPositionY(float positionY){
		this.positionY = positionY;
	}
	//Lấy vị trí X của Player
	public float getPositionY(){
		return this.positionY;
	}
	//-----------------------------------------
	// Di chuyển Player theo X
	public void moveX(float x) {
		this.positionX = x;
		movePlayer();
	}
	// Di chuyển Player theo Y
	public void moveY(float y) {
		this.positionY = y;
		movePlayer();
	}

	//Update vị trí X, Y -------------------------------------------------
	public void moveRelativeXY(float moveRelativeX, float moveRelativeY){
		this.positionX += moveRelativeX;
		this.positionY += moveRelativeY;
		movePlayer();
	}
	// Di chuyển Player --------------------------------------------------
	private void movePlayer() {
		player_AnimatedSprite.setPosition(this.positionX, this.positionY);
	}
	// Thiết đặt vị trí Player theo X, Y ---------------------------------
	public void setPositionXY(float positionX, float positionY) {
		this.positionX = positionX;
		this.positionY = positionY;
	}
	// Thiết đặt trạng thái di chuyển của Player --------------------------
	public void setStatusPlayer(int status) {
		this.STATUS_PLAYER = status;
		showPlayerStatus();
	}
	// Lấy trạng thái di chuyển của Player --------------------------------
	public int getStatusMario() {
		return this.STATUS_PLAYER;
	}
	
	//======================================||  Lấy các frame Player theo từng trạng thái ||======================================//
	
	private void showPlayerStatus() {	
		switch (this.STATUS_PLAYER) 
		{
			case StatusPlayer.MOVE_LEFT: {
				player_AnimatedSprite.animate(new long[] { 100, 100 }, 4, 5, true);
				break;
			}
			case StatusPlayer.MOVE_RIGHT: {
				player_AnimatedSprite.animate(new long[] { 100, 100 }, 0, 1, true);
				break;
			}
			case StatusPlayer.MOVE_UP_LEFT: {
				player_AnimatedSprite.animate(new long[] { 100 }, new int[] { 7 }, 2);
				break;
			}
			case StatusPlayer.MOVE_UP_RIGHT: {
				player_AnimatedSprite.animate(new long[] { 100 }, new int[] { 2 }, 2);
				break;
			}
	
			case StatusPlayer.UN_MOVE_LEFT: {
				player_AnimatedSprite.animate(new long[] { 100 }, new int[] { 4 }, 2);
				break;
			}
			case StatusPlayer.UN_MOVE_RIGHT: {
				player_AnimatedSprite.animate(new long[] { 100 }, new int[] { 0 }, 2);
				break;
			}
			case StatusPlayer.UN_MOVE_UP_LEFT: {
				player_AnimatedSprite.animate(new long[] { 100 }, new int[] { 4 }, 2);
				break;
			}
			case StatusPlayer.UN_MOVE_UP_RIGHT: {
				player_AnimatedSprite.animate(new long[] { 100 }, new int[] { 0 }, 2);
				break;
			}
		}

	}
	
	//==============================================|| CÁC HÀM XÉT VA CHẠM ||=============================================//
	
	public boolean collision(AnimatedSprite b) 	// Va chạm animated sprite
	{	
		A.setPosition(player_AnimatedSprite.getX() + 3,player_AnimatedSprite.getY() + 3);
		B.setPosition(b.getX() + 3,b.getY() + 3);
		if(A.collidesWith(B))
			return true;
		return false;
	}
	
	public boolean collision(Sprite b) 			// Va chạm sprite
	{	
		A.setPosition(player_AnimatedSprite.getX() + 3,player_AnimatedSprite.getY() + 3);
		B.setPosition(b.getX() + 3,b.getY() + 3);
		if(A.collidesWith(B))
			return true;
		return false;
	}
	
	public boolean collisionKill(AnimatedSprite b){ 	// Va chạm tiêu diệt quái || player die
		
		A.setPosition(player_AnimatedSprite.getX() + player_AnimatedSprite.getWidth() / 2 ,player_AnimatedSprite.getY() + player_AnimatedSprite.getHeight()/2 );
		B.setPosition(b.getX() + b.getWidth()/ 2, b.getY() );
		if(A.collidesWith(B))
			return true;
		return false;
	}

	// Thiết đặt mạng Player
	public void setHeart(int heart){
		this.HEART = heart;
	}
	// Lấy mạng Player
	public int getHeart(){
		return this.HEART;
	}
	
}
